package databases

import (
	"fmt"

	"gorm.io/driver/clickhouse"
	"gorm.io/gorm"
)

// 常量定义
const (
	ClickHouseDefaultPort = 9000
	ClickHouseDialTimeout = "10s"
	ClickHouseReadTimeout = "20s"
	// ClickHouse 不支持 charset 参数，已移除默认值
)

// ClickHouseConfig ClickHouse 数据库配置
type ClickHouseConfig Database

// 确保实现了InitDBter接口
var _ InitDBter = (*ClickHouseConfig)(nil)

// InitDB 初始化ClickHouse数据库连接
func (d *ClickHouseConfig) InitDB() *gorm.DB {
	// 设置默认值
	d.setClickHouseDefaults()

	// 构建DSN连接字符串
	dsn := d.buildDSN()

	// 创建数据库连接
	db, err := gorm.Open(clickhouse.Open(dsn), &gorm.Config{
		DisableForeignKeyConstraintWhenMigrating: true,
	})
	if err != nil {
		panic(fmt.Sprintf("ClickHouse数据库连接失败: %v", err))
	}

	return db
}

// setClickHouseDefaults 设置ClickHouse默认配置
func (d *ClickHouseConfig) setClickHouseDefaults() {
	if d.Port == 0 {
		d.Port = ClickHouseDefaultPort
	}
	// ClickHouse 不支持 charset 参数，不设置默认值
}

// buildDSN 构建ClickHouse DSN连接字符串
// 注意: ClickHouse 不支持 charset 参数，因此不添加该参数
func (d *ClickHouseConfig) buildDSN() string {
	dsn := fmt.Sprintf("clickhouse://%s:%s@%s:%d/%s?dial_timeout=%s&read_timeout=%s",
		d.Username, d.Password, d.Host, d.Port, d.Database,
		ClickHouseDialTimeout, ClickHouseReadTimeout)

	// ClickHouse 不支持 charset 设置，已移除该参数

	return dsn
}
